package com.atguigu.algorithm.sort;

import java.util.Arrays;

/**
 * 插入排序
 *
 * @author xr-8
 * @date 2022-09-10
 * @time 17:43
 */
public class InsertSort {

    public static void main(String[] args) {
//        int arr[] = {5, 0, 7, 4, 10, 1};
//        int arr[] = {1, 2, 3, 4, 5, 6};
        int arr[] = {2, 1, 3, 4, 5, 6};
        sort(arr);
//        sortExchange(arr);
    }

    /**
     * 移动式插入，比交换式插入效率高
     * 说明
     *  1. insertIndex >= 0 保证在给insertVal 找插入位置，不越界
     *  2. insertVal < arr[insertIndex] 待插入的数，还没有找到插入位置
     *  3. 就需要将 arr[insertIndex] 后移
     * @param arr
     */
    public static void sort(int[] arr) {
        int insertVal = 0;
        int insertIndex = 0;
        for (int i = 1 ; i < arr.length; i++) {
            insertVal = arr[i];
            insertIndex = i-1; // 即arr[1]的前面这个数的下标
            // 给insertVal 找到插入的位置
            while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
                arr[insertIndex+1] = arr[insertIndex];
                insertIndex--;
            }
            // 当退出while循环时，说明插入的位置找到, insertIndex + 1
            if (insertIndex + 1 != i) {
                arr[insertIndex + 1] = insertVal;
            }
        }
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 交换法，效率比移位法低
     * @param arr
     */
    public static void sortExchange(int[] arr) {
        int temp;
        for (int i = 1 ; i < arr.length; i++) {
            for (int j = 0; j < i; j++) {
                if (arr[i] < arr[j]) {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }

}
